κ°μ²΄ μ§ν₯ μ€κ³μ SOLID μμΉμ λν ν¬κ΄μ μΈ μλ΄μμ λλ€. κ° μμΉμ μμμ μ€μ©μ μΈ μ‘°μΈκ³Ό ν¨κ» μ€λͺ νμ¬ μ μ§λ³΄μ κ°λ₯νκ³ νμ₯ κ°λ₯ν μννΈμ¨μ΄λ₯Ό ꡬμΆνλ λ° λμμ μ€λλ€.
SOLID μμΉ: κ²¬κ³ ν μννΈμ¨μ΄λ₯Ό μν κ°μ²΄ μ§ν₯ μ€κ³ μ§μΉ¨
μννΈμ¨μ΄ κ°λ°μ μΈκ³μμ κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯νλ©° νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ λ§λλ κ²μ 무μλ³΄λ€ μ€μν©λλ€. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)μ μ΄λ¬ν λͺ©νλ₯Ό λ¬μ±νκΈ° μν κ°λ ₯ν ν¨λ¬λ€μμ μ 곡νμ§λ§, 볡μ‘νκ³ μ·¨μ½ν μμ€ν μ λ§λ€μ§ μμΌλ €λ©΄ ν립λ μμΉμ λ°λ₯΄λ κ²μ΄ μ€μν©λλ€. SOLID μμΉμ μ΄ν΄νκ³ ν μ€νΈνλ©° μμ νκΈ° μ¬μ΄ μννΈμ¨μ΄λ₯Ό μ€κ³νκΈ° μν λ‘λλ§΅μ μ 곡νλ λ€μ― κ°μ§ κΈ°λ³Έ μ§μΉ¨ μΈνΈμ λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ κ° μμΉμ μμΈν νꡬνκ³ λ λμ μννΈμ¨μ΄λ₯Ό ꡬμΆνλ λ° λμμ΄ λλ μ€μ μμμ ν΅μ°°λ ₯μ μ 곡ν©λλ€.
SOLID μμΉμ΄λ 무μμΈκ°μ?
SOLID μμΉμ λ‘λ²νΈ C. λ§ν΄("Uncle Bob"μΌλ‘λ μλ €μ§)μ΄ μκ°νμΌλ©°, κ°μ²΄ μ§ν₯ μ€κ³μ μ΄μμ λλ€. μ΄λ μ격ν κ·μΉμ΄λΌκΈ°λ³΄λ€λ κ°λ°μλ€μ΄ λ μ μ§λ³΄μ κ°λ₯νκ³ μ μ°ν μ½λλ₯Ό λ§λ€ μ μλλ‘ λλ μ§μΉ¨μ λλ€. SOLIDλ λ€μμ μ½μμ λλ€:
- S - λ¨μΌ μ± μ μμΉ (Single Responsibility Principle)
- O - κ°λ°©/νμ μμΉ (Open/Closed Principle)
- L - 리μ€μ½ν μΉν μμΉ (Liskov Substitution Principle)
- I - μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (Interface Segregation Principle)
- D - μμ‘΄μ± μμ μμΉ (Dependency Inversion Principle)
κ° μμΉμ λν΄ μμΈν μμλ³΄κ³ μ΄λ€μ΄ λ λμ μννΈμ¨μ΄ μ€κ³μ μ΄λ»κ² κΈ°μ¬νλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
1. λ¨μΌ μ± μ μμΉ (SRP)
μ μ
λ¨μΌ μ± μ μμΉμ ν΄λμ€κ° λ³κ²½λμ΄μΌ ν μ΄μ κ° λ¨ νλλΏμ΄μ΄μΌ νλ€κ³ λͺ μν©λλ€. λ€μ λ§ν΄, ν΄λμ€λ λ¨ νλμ μμ λλ μ± μλ§ κ°μ ΈμΌ ν©λλ€. ν΄λμ€κ° μ¬λ¬ μ± μμ κ°μ§λ©΄, κ°νκ² κ²°ν©λμ΄ μ μ§λ³΄μκ° μ΄λ €μμ§λλ€. ν κ°μ§ μ± μμ λν λ³κ²½μ΄ μλμΉ μκ² ν΄λμ€μ λ€λ₯Έ λΆλΆμ μν₯μ λ―Έμ³ μκΈ°μΉ μμ λ²κ·Έμ 볡μ‘μ± μ¦κ°λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
μ€λͺ λ° μ΄μ
SRPλ₯Ό μ€μν¨μΌλ‘μ¨ μ»λ μ£Όμ μ΄μ μ λͺ¨λμ± λ° μ μ§λ³΄μμ± μ¦κ°μ λλ€. ν΄λμ€κ° λ¨μΌ μ± μμ κ°μ§ λ, μ΄ν΄νκ³ ν μ€νΈνλ©° μμ νκΈ°κ° λ μ½μ΅λλ€. λ³κ²½ μ¬νμ΄ μλμΉ μμ κ²°κ³Όλ₯Ό μ΄λν κ°λ₯μ±μ΄ μ μΌλ©°, λΆνμν μμ‘΄μ±μ λμ νμ§ μκ³ λ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμμ ν΄λμ€λ₯Ό μ¬μ¬μ©ν μ μμ΅λλ€. λν ν΄λμ€κ° νΉμ μμ μ μ§μ€νλ―λ‘ λ λμ μ½λ ꡬμ±μ μ΄μ§ν©λλ€.
μμ
μ¬μ©μ μΈμ¦κ³Ό μ¬μ©μ νλ‘ν κ΄λ¦¬λ₯Ό λͺ¨λ μ²λ¦¬νλ `User`λΌλ ν΄λμ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ. μ΄ ν΄λμ€λ λ κ°μ§ λ³κ°μ μ± μμ κ°μ§κ³ μκΈ° λλ¬Έμ SRPλ₯Ό μλ°ν©λλ€.
SRP μλ° (μμ)
```java public class User { public void authenticate(String username, String password) { // μΈμ¦ λ‘μ§ } public void changePassword(String oldPassword, String newPassword) { // λΉλ°λ²νΈ λ³κ²½ λ‘μ§ } public void updateProfile(String name, String email) { // νλ‘ν μ λ°μ΄νΈ λ‘μ§ } } ```SRPλ₯Ό μ€μνλ €λ©΄ μ΄λ¬ν μ± μμ λ€λ₯Έ ν΄λμ€λ‘ λΆλ¦¬ν μ μμ΅λλ€:
SRP μ€μ (μμ)μ΄ μμ λ μ€κ³μμ `UserAuthenticator`λ μ¬μ©μ μΈμ¦μ μ²λ¦¬νκ³ , `UserProfileManager`λ μ¬μ©μ νλ‘ν κ΄λ¦¬λ₯Ό μ²λ¦¬ν©λλ€. κ° ν΄λμ€λ λ¨μΌ μ± μμ κ°μ§λ―λ‘ μ½λλ₯Ό λ λͺ¨λννκ³ μ μ§λ³΄μνκΈ° μ½κ² λ§λλλ€.
μ€μ©μ μΈ μ‘°μΈ
- ν΄λμ€μ λ€μν μ± μμ μλ³ν©λλ€.
- μ΄λ¬ν μ± μμ λ€λ₯Έ ν΄λμ€λ‘ λΆλ¦¬ν©λλ€.
- κ° ν΄λμ€κ° λͺ ννκ³ μ μ μλ λͺ©μ μ κ°μ§κ³ μλμ§ νμΈν©λλ€.
2. κ°λ°©/νμ μμΉ (OCP)
μ μ
κ°λ°©/νμ μμΉμ μννΈμ¨μ΄ μν°ν°(ν΄λμ€, λͺ¨λ, ν¨μ λ±)λ νμ₯μ λν΄ μ΄λ € μμ΄μΌ νμ§λ§, μμ μ λν΄μλ λ«ν μμ΄μΌ νλ€κ³ λͺ μν©λλ€. μ΄λ κΈ°μ‘΄ μ½λλ₯Ό μμ νμ§ μκ³ λ μμ€ν μ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν μ μμ΄μΌ ν¨μ μλ―Έν©λλ€.
μ€λͺ λ° μ΄μ
OCPλ μ μ§λ³΄μ κ°λ₯νκ³ νμ₯ κ°λ₯ν μννΈμ¨μ΄λ₯Ό ꡬμΆνλ λ° μ€μν©λλ€. μλ‘μ΄ κΈ°λ₯μ΄λ λμμ μΆκ°ν΄μΌ ν λ, μ΄λ―Έ μ¬λ°λ₯΄κ² μλνλ κΈ°μ‘΄ μ½λλ₯Ό μμ ν νμκ° μμ΄μΌ ν©λλ€. κΈ°μ‘΄ μ½λλ₯Ό μμ νλ©΄ λ²κ·Έλ₯Ό λμ νκ³ κΈ°μ‘΄ κΈ°λ₯μ μμμν¬ μνμ΄ μ»€μ§λλ€. OCPλ₯Ό μ€μν¨μΌλ‘μ¨ μμ€ν μ μμ μ±μ μν₯μ μ£Όμ§ μκ³ κΈ°λ₯μ νμ₯ν μ μμ΅λλ€.
μμ
λ€μν λνμ λ©΄μ μ κ³μ°νλ `AreaCalculator`λΌλ ν΄λμ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ. μ²μμλ μ¬κ°νμ λ©΄μ κ³μ°λ§ μ§μν μ μμ΅λλ€.
OCP μλ° (μμ)μμ λ©΄μ κ³μ°μ μ§μνλ €λ©΄ `AreaCalculator` ν΄λμ€λ₯Ό μμ ν΄μΌ νλ©°, μ΄λ OCPλ₯Ό μλ°ν©λλ€.
OCPλ₯Ό μ€μνλ €λ©΄ μΈν°νμ΄μ€λ μΆμ ν΄λμ€λ₯Ό μ¬μ©νμ¬ λͺ¨λ λνμ λν κ³΅ν΅ `area()` λ©μλλ₯Ό μ μν μ μμ΅λλ€.
OCP μ€μ (μμ)
```java interface Shape { double area(); } class Rectangle implements Shape { double width; double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double area() { return width * height; } } class Circle implements Shape { double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } } public class AreaCalculator { public double calculateArea(Shape shape) { return shape.area(); } } ```μ΄μ μλ‘μ΄ λνμ μ§μνλ €λ©΄ `AreaCalculator` ν΄λμ€λ₯Ό μμ νμ§ μκ³ `Shape` μΈν°νμ΄μ€λ₯Ό ꡬννλ μ ν΄λμ€λ₯Ό μμ±νκΈ°λ§ νλ©΄ λ©λλ€.
μ€μ©μ μΈ μ‘°μΈ
- μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€λ₯Ό μ¬μ©νμ¬ κ³΅ν΅ λμμ μ μν©λλ€.
- μμ λλ ꡬμ±μ ν΅ν΄ νμ₯ κ°λ₯νλλ‘ μ½λλ₯Ό μ€κ³ν©λλ€.
- μλ‘μ΄ κΈ°λ₯μ μΆκ°ν λ κΈ°μ‘΄ μ½λλ₯Ό μμ νλ κ²μ νΌν©λλ€.
3. 리μ€μ½ν μΉν μμΉ (LSP)
μ μ
리μ€μ½ν μΉν μμΉμ μλΈνμ μ΄ νλ‘κ·Έλ¨μ μ νμ±μ λ³κ²½νμ§ μκ³ μμ μ κΈ°λ³Έ νμ μΌλ‘ λ체 κ°λ₯ν΄μΌ νλ€κ³ λͺ μν©λλ€. κ°λ¨ν λ§ν΄, κΈ°λ³Έ ν΄λμ€μ νμ ν΄λμ€κ° μλ κ²½μ°, μκΈ°μΉ μμ λμμ μ λ°νμ§ μκ³ κΈ°λ³Έ ν΄λμ€κ° μ¬μ©λλ λͺ¨λ κ³³μμ νμ ν΄λμ€λ₯Ό μ¬μ©ν μ μμ΄μΌ ν©λλ€.
μ€λͺ λ° μ΄μ
LSPλ μμμ΄ μ¬λ°λ₯΄κ² μ¬μ©λκ³ νμ ν΄λμ€κ° κΈ°λ³Έ ν΄λμ€μ μΌκ΄λκ² λμνλλ‘ λ³΄μ₯ν©λλ€. LSPλ₯Ό μλ°νλ©΄ μκΈ°μΉ μμ μ€λ₯κ° λ°μνκ³ μμ€ν λμμ μΆλ‘ νκΈ° μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€. LSPλ₯Ό μ€μνλ©΄ μ½λ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ΄ ν₯μλ©λλ€.
μμ
`fly()` λ©μλλ₯Ό κ°μ§ `Bird`λΌλ κΈ°λ³Έ ν΄λμ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ. `Penguin`μ΄λΌλ νμ ν΄λμ€λ `Bird`λ₯Ό μμν©λλ€. κ·Έλ¬λ νκ·μ λ μ μμ΅λλ€.
LSP μλ° (μμ)μ΄ μμμμ `Penguin` ν΄λμ€λ `fly()` λ©μλλ₯Ό μ€λ²λΌμ΄λνκ³ μμΈλ₯Ό λ°μμν€λ―λ‘ LSPλ₯Ό μλ°ν©λλ€. `Bird` κ°μ²΄κ° μμλλ κ³³μ `Penguin` κ°μ²΄λ₯Ό μ¬μ©νλ €κ³ νλ©΄ μκΈ°μΉ μμ μμΈκ° λ°μν©λλ€.
LSPλ₯Ό μ€μνλ €λ©΄, λ μλ€λλ μλ₯Ό λνλ΄λ μλ‘μ΄ μΈν°νμ΄μ€λ μΆμ ν΄λμ€λ₯Ό λμ ν μ μμ΅λλ€.
LSP μ€μ (μμ)μ΄μ λ μ μλ ν΄λμ€λ§ `FlyingBird` μΈν°νμ΄μ€λ₯Ό ꡬνν©λλ€. `Penguin` ν΄λμ€λ λ μ΄μ LSPλ₯Ό μλ°νμ§ μμ΅λλ€.
μ€μ©μ μΈ μ‘°μΈ
- νμ ν΄λμ€κ° κΈ°λ³Έ ν΄λμ€μ μΌκ΄λκ² λμνλμ§ νμΈν©λλ€.
- κΈ°λ³Έ ν΄λμ€κ° μμΈλ₯Ό λ°μμν€μ§ μλ κ²½μ° μ€λ²λΌμ΄λλ λ©μλμμ μμΈλ₯Ό λ°μμν€μ§ μλλ‘ ν©λλ€.
- νμ ν΄λμ€κ° κΈ°λ³Έ ν΄λμ€μ λ©μλλ₯Ό ꡬνν μ μλ κ²½μ° λ€λ₯Έ μ€κ³λ₯Ό κ³ λ €ν©λλ€.
4. μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (ISP)
μ μ
μΈν°νμ΄μ€ λΆλ¦¬ μμΉμ ν΄λΌμ΄μΈνΈκ° μ¬μ©νμ§ μλ λ©μλμ μμ‘΄νλλ‘ κ°μλ°μμλ μ λλ€κ³ λͺ μν©λλ€. μ¦, μΈν°νμ΄μ€λ ν΄λΌμ΄μΈνΈμ νΉμ μꡬ μ¬νμ λ§κ² μ‘°μ λμ΄μΌ ν©λλ€. ν¬κ³ λ¨μΌμ μΈ μΈν°νμ΄μ€λ λ μκ³ μ§μ€λ μΈν°νμ΄μ€λ‘ λΆν λμ΄μΌ ν©λλ€.
μ€λͺ λ° μ΄μ
ISPλ ν΄λΌμ΄μΈνΈκ° νμνμ§ μμ λ©μλλ₯Ό ꡬννλλ‘ κ°μλ°λ κ²μ λ°©μ§νμ¬ κ²°ν©λλ₯Ό μ€μ΄κ³ μ½λ μ μ§λ³΄μμ±μ ν₯μμν΅λλ€. μΈν°νμ΄μ€κ° λ무 ν¬λ©΄ ν΄λΌμ΄μΈνΈλ μμ μ νΉμ μꡬ μ¬νκ³Ό κ΄λ ¨ μλ λ©μλμ μμ‘΄νκ² λ©λλ€. μ΄λ λΆνμν 볡μ‘μ±μ μ΄λνκ³ λ²κ·Έλ₯Ό λμ ν μνμ μ¦κ°μν¬ μ μμ΅λλ€. ISPλ₯Ό μ€μν¨μΌλ‘μ¨ λ μ§μ€λκ³ μ¬μ¬μ© κ°λ₯ν μΈν°νμ΄μ€λ₯Ό λ§λ€ μ μμ΅λλ€.
μμ
μΈμ, μ€μΊ, ν©μ€ λ©μλλ₯Ό μ μνλ `Machine`μ΄λΌλ ν° μΈν°νμ΄μ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
ISP μλ° (μμ)
```java interface Machine { void print(); void scan(); void fax(); } class SimplePrinter implements Machine { @Override public void print() { // μΈμ λ‘μ§ } @Override public void scan() { // μ΄ νλ¦°ν°λ μ€μΊν μ μμΌλ―λ‘ μμΈλ₯Ό λ°μμν€κ±°λ λΉμλ‘λλ€. throw new UnsupportedOperationException(); } @Override public void fax() { // μ΄ νλ¦°ν°λ ν©μ€λ₯Ό λ³΄λΌ μ μμΌλ―λ‘ μμΈλ₯Ό λ°μμν€κ±°λ λΉμλ‘λλ€. throw new UnsupportedOperationException(); } } ````SimplePrinter` ν΄λμ€λ `print()` λ©μλλ§ κ΅¬ννλ©΄ λμ§λ§, `scan()` λ° `fax()` λ©μλλ ꡬννλλ‘ κ°μλ°μ ISPλ₯Ό μλ°ν©λλ€.
ISPλ₯Ό μ€μνλ €λ©΄ `Machine` μΈν°νμ΄μ€λ₯Ό λ μμ μΈν°νμ΄μ€λ‘ λΆν ν μ μμ΅λλ€:
ISP μ€μ (μμ)
```java interface Printer { void print(); } interface Scanner { void scan(); } interface Fax { void fax(); } class SimplePrinter implements Printer { @Override public void print() { // μΈμ λ‘μ§ } } class MultiFunctionPrinter implements Printer, Scanner, Fax { @Override public void print() { // μΈμ λ‘μ§ } @Override public void scan() { // μ€μΊ λ‘μ§ } @Override public void fax() { // ν©μ€ λ‘μ§ } } ```μ΄μ `SimplePrinter` ν΄λμ€λ νμν `Printer` μΈν°νμ΄μ€λ§ ꡬνν©λλ€. `MultiFunctionPrinter` ν΄λμ€λ μΈ κ°μ§ μΈν°νμ΄μ€λ₯Ό λͺ¨λ ꡬννμ¬ μ 체 κΈ°λ₯μ μ 곡ν©λλ€.
μ€μ©μ μΈ μ‘°μΈ
- ν° μΈν°νμ΄μ€λ₯Ό λ μκ³ μ§μ€λ μΈν°νμ΄μ€λ‘ λΆν ν©λλ€.
- ν΄λΌμ΄μΈνΈκ° νμν λ©μλμλ§ μμ‘΄νλλ‘ ν©λλ€.
- ν΄λΌμ΄μΈνΈκ° λΆνμν λ©μλλ₯Ό ꡬννλλ‘ κ°μνλ λ¨μΌμ μΈ μΈν°νμ΄μ€ μμ±μ νΌν©λλ€.
5. μμ‘΄μ± μμ μμΉ (DIP)
μ μ
μμ‘΄μ± μμ μμΉμ μμ μμ€ λͺ¨λμ΄ νμ μμ€ λͺ¨λμ μμ‘΄ν΄μλ μ λλ€κ³ λͺ μν©λλ€. λ λ€ μΆμνμ μμ‘΄ν΄μΌ ν©λλ€. μΆμνλ μΈλΆ μ¬νμ μμ‘΄ν΄μλ μ λ©λλ€. μΈλΆ μ¬νμ μΆμνμ μμ‘΄ν΄μΌ ν©λλ€.
μ€λͺ λ° μ΄μ
DIPλ λμ¨ν κ²°ν©μ μ΄μ§νκ³ μμ€ν μ λ³κ²½νκ³ ν μ€νΈνκΈ° μ½κ² λ§λλλ€. μμ μμ€ λͺ¨λ(μ: λΉμ¦λμ€ λ‘μ§)μ νμ μμ€ λͺ¨λ(μ: λ°μ΄ν° μ κ·Ό)μ μμ‘΄ν΄μλ μ λ©λλ€. λμ λ λ€ μΆμν(μ: μΈν°νμ΄μ€)μ μμ‘΄ν΄μΌ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μμ μμ€ λͺ¨λμ μν₯μ μ£Όμ§ μκ³ νμ μμ€ λͺ¨λμ λ€λ₯Έ ꡬνμ μ½κ² κ΅μ²΄ν μ μμ΅λλ€. λν νμ μμ€ μμ‘΄μ±μ λͺ¨μ(mock)νκ±°λ μ€ν (stub)ν μ μμΌλ―λ‘ λ¨μ ν μ€νΈλ₯Ό μμ±νκΈ°κ° λ μ½μ΅λλ€.
μμ
μ¬μ©μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν΄ `MySQLDatabase`λΌλ ꡬ체μ μΈ ν΄λμ€μ μμ‘΄νλ `UserManager`λΌλ ν΄λμ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
DIP μλ° (μμ)
```java class MySQLDatabase { public void saveUser(String username, String password) { // MySQL λ°μ΄ν°λ² μ΄μ€μ μ¬μ©μ λ°μ΄ν° μ μ₯ } } class UserManager { private MySQLDatabase database; public UserManager() { this.database = new MySQLDatabase(); } public void createUser(String username, String password) { // μ¬μ©μ λ°μ΄ν° μ ν¨μ± κ²μ¬ database.saveUser(username, password); } } ```μ΄ μμμμ `UserManager` ν΄λμ€λ `MySQLDatabase` ν΄λμ€μ κ°νκ² κ²°ν©λμ΄ μμ΅λλ€. λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€(μ: PostgreSQL)λ‘ μ ννλ €λ©΄ `UserManager` ν΄λμ€λ₯Ό μμ ν΄μΌ νλ©°, μ΄λ DIPλ₯Ό μλ°ν©λλ€.
DIPλ₯Ό μ€μνλ €λ©΄ `saveUser()` λ©μλλ₯Ό μ μνλ `Database`λΌλ μΈν°νμ΄μ€λ₯Ό λμ ν μ μμ΅λλ€. κ·Έλ¬λ©΄ `UserManager` ν΄λμ€λ ꡬ체μ μΈ `MySQLDatabase` ν΄λμ€ λμ `Database` μΈν°νμ΄μ€μ μμ‘΄νκ² λ©λλ€.
DIP μ€μ (μμ)
```java interface Database { void saveUser(String username, String password); } class MySQLDatabase implements Database { @Override public void saveUser(String username, String password) { // MySQL λ°μ΄ν°λ² μ΄μ€μ μ¬μ©μ λ°μ΄ν° μ μ₯ } } class PostgreSQLDatabase implements Database { @Override public void saveUser(String username, String password) { // PostgreSQL λ°μ΄ν°λ² μ΄μ€μ μ¬μ©μ λ°μ΄ν° μ μ₯ } } class UserManager { private Database database; public UserManager(Database database) { this.database = database; } public void createUser(String username, String password) { // μ¬μ©μ λ°μ΄ν° μ ν¨μ± κ²μ¬ database.saveUser(username, password); } } ```μ΄μ `UserManager` ν΄λμ€λ `Database` μΈν°νμ΄μ€μ μμ‘΄νλ©°, `UserManager` ν΄λμ€λ₯Ό μμ νμ§ μκ³ λ λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€ ꡬν κ°μ μ½κ² μ νν μ μμ΅λλ€. μ΄λ μμ‘΄μ± μ£Όμ μ ν΅ν΄ λ¬μ±ν μ μμ΅λλ€.
μ€μ©μ μΈ μ‘°μΈ
- ꡬ체μ μΈ κ΅¬ν보λ€λ μΆμνμ μμ‘΄ν©λλ€.
- μμ‘΄μ± μ£Όμ μ μ¬μ©νμ¬ ν΄λμ€μ μμ‘΄μ±μ μ 곡ν©λλ€.
- μμ μμ€ λͺ¨λμμ νμ μμ€ λͺ¨λμ λν μμ‘΄μ± μμ±μ νΌν©λλ€.
SOLID μμΉ μ¬μ©μ μ΄μ
SOLID μμΉμ μ€μνλ©΄ λ€μκ³Ό κ°μ λ€μν μ΄μ μ μ»μ μ μμ΅λλ€:
- μ μ§λ³΄μμ± ν₯μ: SOLID μ½λλ μ΄ν΄νκ³ μμ νκΈ° λ μ¬μ λ²κ·Έ λ°μ μνμ μ€μ λλ€.
- μ¬μ¬μ©μ± κ°μ : SOLID μ½λλ λ λͺ¨λνλμ΄ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμμ μ¬μ¬μ©ν μ μμ΅λλ€.
- ν μ€νΈ μ©μ΄μ± μ¦λ: SOLID μ½λλ μμ‘΄μ±μ μ½κ² λͺ¨μ(mock)νκ±°λ μ€ν (stub)ν μ μμΌλ―λ‘ ν μ€νΈνκΈ° λ μ½μ΅λλ€.
- κ²°ν©λ κ°μ: SOLID μμΉμ λμ¨ν κ²°ν©μ μ΄μ§νμ¬ μμ€ν μ λ μ μ°νκ³ λ³νμ κ°νκ² λ§λλλ€.
- νμ₯μ± μ¦κ°: SOLID μ½λλ νμ₯ κ°λ₯νλλ‘ μ€κ³λμ΄ μμ€ν μ΄ μ±μ₯νκ³ λ³ννλ μꡬ μ¬νμ μ μν μ μλλ‘ ν©λλ€.
κ²°λ‘
SOLID μμΉμ κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯νλ©° νμ₯ κ°λ₯ν κ°μ²΄ μ§ν₯ μννΈμ¨μ΄λ₯Ό ꡬμΆνκΈ° μν νμμ μΈ μ§μΉ¨μ λλ€. μ΄λ¬ν μμΉμ μ΄ν΄νκ³ μ μ©ν¨μΌλ‘μ¨ κ°λ°μλ€μ μ΄ν΄νκ³ ν μ€νΈνλ©° μμ νκΈ° μ¬μ΄ μμ€ν μ λ§λ€ μ μμ΅λλ€. μ²μμλ 볡μ‘ν΄ λ³΄μΌ μ μμ§λ§, SOLID μμΉμ μ€μν¨μΌλ‘μ¨ μ»λ μ΄μ μ μ΄κΈ° νμ΅ κ³‘μ μ ν¨μ¬ λ₯κ°ν©λλ€. μννΈμ¨μ΄ κ°λ° νλ‘μΈμ€μμ μ΄λ¬ν μμΉμ λ°μλ€μ΄λ©΄ λ λμ μννΈμ¨μ΄λ₯Ό ꡬμΆνλ λ° ν° λμμ΄ λ κ²μ λλ€.
κΈ°μ΅νμΈμ, μ΄λ€μ μ격ν κ·μΉμ΄ μλλΌ μ§μΉ¨μ λλ€. μν©μ΄ μ€μνλ©°, λλ‘λ μ€μ©μ μΈ ν΄κ²°μ± μ μν΄ μμΉμ μ½κ° μ‘°μ ν νμλ μμ΅λλ€. κ·Έλ¬λ SOLID μμΉμ μ΄ν΄νκ³ μ μ©νκΈ° μν΄ λ Έλ ₯νλ κ²μ μμ¬ν μ¬μ§ μμ΄ μννΈμ¨μ΄ μ€κ³ κΈ°μ κ³Ό μ½λ νμ§μ ν₯μμν¬ κ²μ λλ€.